<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
	<meta name="keywords" content="address-server" />
	<meta name="description" content="address-server" />
	<!-- 网页标签标题 -->
	<title>address-server</title>
	<link rel="shortcut icon" href="https://img.alicdn.com/tfs/TB1hgJpHAPoK1RjSZKbXXX1IXXa-64-64.png"/>
	<link rel="stylesheet" href="/build/blogDetail.css" />
</head>
<body>
	<div id="root"><div class="blog-detail-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><img class="logo" src="/img/nacos_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">中</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/blog">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0">NACOS IN CLOUD</a><img class="menu-img" src="https://img.alicdn.com/tfs/TB1esl_m.T1gK0jSZFrXXcNCXXa-200-200.png"/></li><li class="menu-item menu-item-normal"><a href="http://console.nacos.io/nacos/index.html">DEMO-CONSOLE</a></li></ul></div></div></header><section class="blog-content markdown-body"><h1>Nacos环境隔离</h1>
<p>随着Nacos 0.8版本的release，Nacos离正式生产版本又近了一步（其实已经有不少企业已经上了生产，如虎牙）。一般而言，企业研发的流程一般是这样的：先在测试环境开发和测试功能，然后再灰度，最后发布到生产环境。并且，为了生产环境的稳定，测试环境需要跟生产环境隔离；必然要遇到一个问题：多环境问题，即多个环境的数据（如测试环境和生产环境）如何隔离？如何优雅的隔离（不需要用户做任何改动）。下文将就Nacos环境隔离问题，向大家介绍阿里在这方面的实践经验。</p>
<p><a href=""></a><a name="d0eabe32"></a></p>
<h2>什么是环境？</h2>
<p>说到环境隔离，首先应该搞清楚什么环境。 环境这个词目前还没有一个比较统一的定义，有些公司叫环境，在阿里云上叫region，在kubernetes架构中叫namespace等等。本文认为，环境是逻辑上或物理上独立的一整套系统，这套系统中包含了处理用户请求的全部组件（网关、服务框架、微服务注册中心、配置中心、消息系统、缓存、数据库等），可以处理指定类别的请求。举个栗子，很多网站都会有用户id的概念，可以按照用户id划分，用户id以偶数结尾的请求全部由一套系统处理，而奇数结尾的请求由另一套系统处理。如下图所示。 我们这里说的环境隔离是指物理隔离，即不同环境是指不同的机器集群。</p>
<p><img src="https://cdn.nlark.com/yuque/0/2019/png/333810/1559699207043-bff71a91-b187-489e-a3c4-79322913fd54.png#alt=undefined" alt=""></p>
<p><a href=""></a><a name="efec68f6"></a></p>
<h2>环境隔离有什么用</h2>
<p>上一节定义了环境的概念，即一套包含了处理用户请求全部必要组件的系统，用来处理指定类别的请求。本节跟大家讨论一下环境隔离有哪些好处。从概念的定义可以看出，环境隔离至少有三个方面的好处：故障隔离、故障恢复、灰度测试；</p>
<p><a href=""></a><a name="dbbde2aa"></a></p>
<h3>故障隔离</h3>
<p>首先，因为环境是能够处理用户请求的独立组件单元，也就是说用户请求的处理链路有多长，都不会跳出指定的机器集群。即使这部分机器故障了，也只是会影响部分用户，从而把故障隔离在指定的范围内。如果我们按照用户id把全部机器分为十个环境，那么一个环境出问题，对用户的影响会降低为十分之一，大大提高系统可用性。</p>
<p><a href=""></a><a name="e443c432"></a></p>
<h3>故障恢复</h3>
<p>环境隔离的另一个重要优势是可以快速恢复故障。当某个环境的服务出现问题之后，可以快速通过下发配置，改变用户请求的路由方向，把请求路由到另一套环境，实现秒级故障恢复。当然，这需要一个强大的分布式系统支持，尤其是一个强大的配置中心（如Nacos），需要快速把路由规则配置数据推送到全网的应用进程。</p>
<p><a href=""></a><a name="385e0b0a"></a></p>
<h3>灰度测试</h3>
<p>灰度测试是研发流程中不可或缺的一个环节。传统的研发流程中，测试和灰度环节，需要测试同学做各种各样的配置，如绑定host、配置jvm参数、环境变量等等，比较麻烦。经过多年的实践，阿里巴巴内部的测试和灰度对开发和测试非常友好，通过环境隔离功能来保证请求在指定的机器集群处理，开发和测试不需要做任何做任何配置，大大提高了研发效率。</p>
<p><a href=""></a><a name="37555cc2"></a></p>
<h2>Nacos如何做环境隔离</h2>
<p>前面两节讲到了环境的概念、环境隔离有哪些作用，本节将向大家介绍如何把Nacos按照前面的思路隔离成多个环境。Nacos脱胎于阿里巴巴中间件部门的软负载小组，在环境隔离方面我们有多年的经验。下面简单介绍下把Nacos隔离为多个物理集群，nacos客户端不需要做任何代码改动即可实现环境自动路由。</p>
<p><a href=""></a><a name="b6724cff"></a></p>
<h3>原理</h3>
<p>在开始前，我们先做一些约束：</p>
<ul>
<li>一台机器上部署的应用都在一个环境内；</li>
<li>一个应用进程内默认情况下只连一个环境的Nacos；</li>
<li>通过某种手段可以拿到客户端所在机器ip；</li>
<li>用户对机器的网段有规划；</li>
</ul>
<p>下面简单介绍一下基本原理：</p>
<ul>
<li>我们知道网络中32位的ipv4可以划分为很多网段，如192.168.1.0/24这种，并且一般稍大型的公司都会有网段规划，按照一定的用途划分网段。我们可以利用这个原理做环境隔离，即不同网段的IP属于不同的环境，如192.168.1.0/24属于环境A， 192.168.2.0/24属于环境B等。</li>
<li>使用过Nacos的应该知道，有两种方式初始化Nacos客户端实例，一种是直接告诉客户端nacos服务端的IP；另一种是告诉客户端一个endpoint，客户端通过HTTP请求到endpoint查询nacos服务端IP列表。我们利用Nacos第二种初始化方式。</li>
<li>增强endpoint的功能。在endpoint端配置网段和环境的映射关系，endpoint在接收到客户端的请求之后，根据客户端的来源IP所属网段，计算出该客户端所属环境，然后找到对应环境的IP列表返回给客户端。如下图</li>
</ul>
<p><img src="https://cdn.nlark.com/yuque/0/2019/png/333810/1559699221719-b127d968-2374-4fad-b433-733f47642bf0.png#alt=undefined" alt=""></p>
<p><a href=""></a><a name="f172b185"></a></p>
<h2>一个环境隔离server的示例</h2>
<p>上面讲了基于IP段做环境隔离的约束和基本原理，那么如何实现一个地址服务器呢。最简单的方法是基于nginx实现，利用nginx的geo模块，做IP端和环境的映射，然后利用nginx返回静态文件内容。</p>
<ul>
<li></li>
</ul>
<p>安装nginx <a href="http://nginx.org/en/docs/install.html">http://nginx.org/en/docs/install.html</a></p>
<ul>
<li></li>
</ul>
<p>在nginx-proxy.conf中配置geo映射，<a href="http://nginx.org/en/docs/http/ngx_http_geo_module.html">参考这里</a></p>
<pre><code>geo $env {
  default        &quot;&quot;;
  192.168.1.0/24 -env-a;
  192.168.2.0/24 -env-b;
}
</code></pre>
<ul>
<li></li>
</ul>
<p>配置nginx根路径及转发规则，这里只需要简单的返回静态文件的内容；</p>
<pre><code># 在http模块中配置根路径
root                    /tmp/htdocs;

# 在server模块中配置
location / {
  rewrite ^(.*)$  /$1$env break;
}
</code></pre>
<ul>
<li></li>
</ul>
<p>配置Nacos服务端IP列表配置文件，在/tmp/hotdocs/nacos目录下配置以环境名结尾的文件，文件内容为IP，一行一个</p>
<pre><code>$ll /tmp/hotdocs/nacos/
total 0
-rw-r--r-- 1 user1 users 0 Mar  5 08:53 serverlist
-rw-r--r-- 1 user1 users 0 Mar  5 08:53 serverlist-env-a
-rw-r--r-- 1 user1 users 0 Mar  5 08:53 serverlist-env-b

$cat /tmp/hotdocs/nacos/serverlist
192.168.1.2
192.168.1.3
</code></pre>
<ul>
<li></li>
</ul>
<p>验证</p>
<pre><code>curl 'localhost:8080/nacos/serverlist'
192.168.1.2
192.168.1.3
</code></pre>
<p>至此， 一个简单的根据IP网段做环境隔离的示例已经可以工作了，不同网段的nacos客户端会自动获取到不同的Nacos服务端IP列表，实现环境隔离。这种方法的好处是用户不需要配置任何参数，各个环境的代码和配置是一样的，但需要提供底层服务的同学做好网络规划和相关配置。</p>
<p><a href=""></a><a name="25f9c7fa"></a></p>
<h2>总结</h2>
<p>本文简单介绍了环境隔离的概念，环境隔离的三个好处以及Nacos如何基于网段做环境隔离。最后，给出了一个基于nginx做endpoint服务端的环境隔离配置示例。本文只是列出了一种可行的方法，不排除有更优雅的实现方法，如果大家有更好的方法可以看到nacos社区或<a href="naocs.io">官网</a>贡献方案。</p>
</section><footer class="footer-container"><div class="footer-body"><img src="/img/nacos_gray.png"/><div class="cols-container"><div class="col col-12"><h3>Vision</h3><p>By providing an easy-to-use service infrastructure such as dynamic service discovery, service configuration, service sharing and management and etc., Nacos help users better construct, deliver and manage their own service platform, reuse and composite business service faster and deliver value of business innovation more quickly so as to win market for users in the era of cloud native and in all cloud environments, such as private, mixed, or public clouds.</p></div><div class="col col-6"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/what-is-nacos.html" target="_self">Overview</a></dd><dd><a href="/en-us/docs/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/contributing.html" target="_self">Developer guide</a></dd></dl></div><div class="col col-6"><dl><dt>Resources</dt><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0" target="_self">Cloud Service MSE</a></dd><dd><a href="https://www.aliyun.com/product/edas?source_type=nacos_pc_20181219" target="_self">Cloud Service EDAS</a></dd><dd><a href="https://www.aliyun.com/product/ahas?source_type=nacos_pc_20190225" target="_self">Cloud Service AHAS</a></dd></dl></div></div><div class="copyright"><span>@ 2018 The Nacos Authors | An Alibaba Middleware (Aliware) Project</span></div></div></footer></div></div>
	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
	<script>
		window.rootPath = '';
  </script>
	<script src="/build/blogDetail.js"></script>
</body>
</html>